<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>解构赋值</title>
</head>
<body>
    <script>
        //-------------------------------------------------------基本规则------------------------------------------------------
        // 1. 字符串解构赋值
        const [a, b, c, d, e] = 'hello';

        // 2. 数值解构赋值
        const {toStrinig: s} = '123';

        // 3. 数组解构赋值：自定变量，按照顺序获取
        const [x1, y1] = [1, 2];
        const [x2, y2=2] = [1];

        // 4. 对象解构赋值：变量名和键名统一，可以不按照顺序，如果没有，返回undefined，可以改名
        const {x3, y3} = {x3:1, y3:2};
        const {x4, y4=2} = {x3:1};
        const {x5, y5:z} = {x5:1, y5:2};


        //-------------------------------------------------------应用场景----------------------------------------------------------------------------
        // 1. 交换变量
        [m,n] = [n,m]

        // 2. 返回函数多个值
        [m,n] = function() {};

        // 3. 定义函数参数
        func([1,2])

        // 4. 提取json数据
        const {name, age} = packageJSON;

        // 5.定义函数参数默认值
        function fnc({x=1, y=2} ={}) {};

        // 6. 遍历Map解构
        for (let [k, v] of Map) {};

        // 7. 输入模块指定属性和方法
        const { readFile, writeFile } = require('fs');


        //--------------------------------------------------------重难点------------------------------------------------------------------------
        /*
            匹配模式：只要等号两边的模式相同，左边的变量就会被赋予对应的值
            解构赋值规则：只要等号右边的值不是对象或数组，就先将其转为对象
            解构默认值生效条件：属性值严格等于undefined
            解构遵循匹配模式
            解构不成功时变量的值等于undefined
            undefined和null无法转为对象，因此无法进行解构
        */
    </script>
</body>
</html>